#!/bin/bash
#run.haproxy.config.sh
#生成haproxy配置

##########
Config_file=/usr/local/etc/haproxy/haproxy.cfg

# find cofnig file,exit
[ -f ${Config_file} ] && { exit 0 ; }

##########
##状态页设置 用户:密码  端口  url后缀
# export Stats_set="admin:admin1 1080 /stats"
##代理 名称,模式(tcp|http),端口,被代理端口
# export Listen-1="k8s tcp 6445 6443"
##被代理ip地址列表
# export IPlist-1="172.16.11.141 172.16.11.142 172.16.11.143"
##########

if [ $(env |grep Stats_set |wc -l) -eq 1 ];then
    Stats=$(env |awk -F'=' '/Stats_set/{print $2}')
    N=$(echo $Stats |wc -w)
    N1=$(echo $Stats |awk '{print $1}')
    N2=$(echo $Stats |awk '{print $2}')
    N3=$(echo $Stats |awk '{print $3}')
    [ $N -ge 1 ] && { Stats_user=$N1 ; }
    [ $N -ge 2 ] && { Stats_port=$N2 ; }
    [ $N -ge 3 ] && { Stats_url=$N3 ; }
fi

cat >${Config_file} <<EOF
global  #####全局配置
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
daemon
maxconn 4096  #最大连接数 
#nbproc 1     #进程数量
defaults  #####默认配置部分
log global
mode http            #默认模式{ tcp|http|health }
option httplog       #日志类别,采用httplog
option dontlognull   #不记录健康检查日志 
retries 2            #2次连接失败不可用
option httpclose     #请求完毕关闭http通道
option abortonclose  #负载高时关闭长链接 
maxconn 4096         #最大连接数 
timeout connect 5m   #连接超时  
timeout client 1m    #客户端超时 
timeout server 5m    #服务器超时 
timeout check 10s    #心跳检测超时 
balance roundrobin   #负载均衡方式，轮询
##########统计页面
listen stats
    bind :${Stats_port:-1080}
    mode http
    option httplog
    log 127.0.0.1 local0 err 
    stats refresh 30s
    maxconn 10               #最大连接数  
    stats uri ${Stats_url:-/stats}   #url后缀
    stats realm Haproxy\ Statistics
    stats auth ${Stats_user:-admin:admin}   #用户和密码
    stats hide-version       #隐藏版本信息
    stats admin if TRUE      #设置手工启动/禁用
EOF

##########

Create_listen() {
Log=${Log:-tcplog}
[ $2 = tcp ] || { Log=httplog ; }
echo "
##########
listen $1
    bind :$3
    mode $2
    option ${Log}"
}
#
Create_server() {
#i=1
for SIP in $*;do
    #check ip
    if [ $(echo ${SIP} |egrep "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" |wc -l) -eq 1 ]; then
        Ip_end=$(echo ${SIP} |awk -F'.' '{print $NF}')
        echo "    server node-${Ip_end} ${SIP}:${IP_Port} check inter 3000 rise 2 fall 3"
        #i=$(($i+1))
    fi
done
}

##########
#run

#删除注释
sed -i "s/#.*//g" ${Config_file}

Listen_name=$(env |grep Listen_ |awk -F'=' '{print $1}')
IPlist_name=$(env |grep IPlist_ |awk -F'=' '{print $1}')
for L in ${Listen_name};do
    for I in ${IPlist_name};do
        #尾数相同
        if [ $(echo $L |awk -F'_' '{print $NF}') = $(echo $I |awk -F'_' '{print $NF}') ];then
            LS=$(env |grep $L |awk -F'=' '{print $2}')
            IP=$(env |grep $I |awk -F'=' '{print $2}')
            IP_Port=$(echo $LS |awk '{print $NF}')
            Listen_name=$(echo $LS |awk '{print $1}')
            #Listen是4列，IPlist至少1列
            if [ $(echo $LS |wc -w) -eq 4  -a $(echo $IP |wc -w) -ge 1 ];then
                Create_listen $LS >>${Config_file}
                Create_server $IP >>${Config_file}
            fi
            
        fi
    done
done
##########
